package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomDateTime;
import br.com.telescope.adsrt.dom.DomId;
import br.com.telescope.adsrt.dom.DomInteger;
import br.com.telescope.adsrt.dom.DomOption;
import br.com.telescope.adsrt.dom.DomUpper;
import br.com.telescope.adsrt.lib.AdsException;
import br.com.telescope.adsrt.lib.Field;
import br.com.telescope.adsrt.lib.Form;
import br.com.telescope.sql.ModelQuery;
import br.com.telescope.t2.EntityBinding;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.feature.ListFeature;
import br.com.telescope.util.ObjectUtil;
import java.util.ArrayList;
import java.util.List;
import solutions.ferpa.ztest.ent.*;

/**
 * Planos de ensaio do Critérios de aprovações.
 * <p>
 * Interface para consultar os planos de ensaio do Critério de aprovação
 * <P>
 * Telescope origin: ZTEST.CON_PLANOS_ENSAIO_CRITERIO
 * <P>
 * Base entity: ZTEST.CRITERIO_APROVACAO_PLANO_ENSAIO
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class ConPlanosEnsaioCriterio extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "ZTEST.CON_PLANOS_ENSAIO_CRITERIO";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Planos de ensaio do Critérios de aprovações");
    }
    
    protected EntCriterioAprovacaoPlanoEnsaio base;
    protected EntCriterioAprovacaoEnsaio lkp1;
    protected EntPlanoExecucao plex;
    protected EntCriterioAprovacaoPlanoEnsaio rec; // NEED_TJW1_COMPATIBILITY
    
    // Service parameters
    private DomId pIdPlanoEnsaio;
    private DomId pIdCriterioAprovacao;
    
    // Record items
    private DomInteger aSequenciaValidacao;
    private DomDateTime aDataRegistro;
    private DomId aId;
    private DomId aPlanoEnsaioId;
    private DomId aCriterioAprovacaoId;
    private DomUpper aLkp1Nome;
    private DomUpper aPlexNome;
    private DomOption aPlexSituacao;
    
    // Query items
    
    @Override
    public String getBaseSql() {
        return "select BASE.*"
                + " , LKP1.NOME as LKP1_NOME"
                + " , PLEX.NOME as PLEX_NOME"
                + " , PLEX.SITUACAO as PLEX_SITUACAO"
                + " , LKP1.ID as Z_LKP1_ID"
                + " , PLEX.ID as Z_PLEX_ID"
                + " from CRITERIO_APROVACAO_PLANO_ENSAIO BASE"
                + " join CRITERIO_APROVACAO_ENSAIO LKP1 on LKP1.ID = BASE.CRITERIO_APROVACAO_ID"
                + " join PLANO_EXECUCAO PLEX on PLEX.ID = BASE.PLANO_ENSAIO_ID";
    }
    
    @Override
    public void initAttributes() {
        
        aSequenciaValidacao = new DomInteger();
        aSequenciaValidacao.context(ctx).name("SEQUENCIA_VALIDACAO").label("Sequência para validação de critérios");
        
        aDataRegistro = new DomDateTime();
        aDataRegistro.context(ctx).name("DATA_REGISTRO").label("Data do registro");
        aDataRegistro.setDefaultValue("[SYSDATE]");
        
        aId = new DomId();
        aId.context(ctx).name("ID").label("Id");
        
        aPlanoEnsaioId = new DomId();
        aPlanoEnsaioId.context(ctx).name("PLANO_ENSAIO_ID").label("Plano de ensaio");
        
        aCriterioAprovacaoId = new DomId();
        aCriterioAprovacaoId.context(ctx).name("CRITERIO_APROVACAO_ID").label("Critério de aprovação");
        
        aLkp1Nome = new DomUpper();
        aLkp1Nome.context(ctx).name("LKP1_NOME").label("Nome do critério de aprovação");
        aLkp1Nome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from CRITERIO_APROVACAO_ENSAIO LKP1)", "q"));
        aLkp1Nome.setAutocompleteLength(0);
        
        aPlexNome = new DomUpper();
        aPlexNome.context(ctx).name("PLEX_NOME").label("Nome do plano de execução");
        aPlexNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from PLANO_EXECUCAO PLEX)", "q"));
        aPlexNome.setAutocompleteLength(2);
        
        aPlexSituacao = new DomOption();
        aPlexSituacao.context(ctx).name("PLEX_SITUACAO").label("Situação do plano").group(true);
        aPlexSituacao.addOption("E", "Em elaboração");
        aPlexSituacao.addOption("A", "Aprovado");
        aPlexSituacao.addOption("D", "Descontinuado");
        aPlexSituacao.setDefaultValue("E");
        
    }
    
    @Override
    public void initParameters() {
        pIdPlanoEnsaio = new DomId(ctx, "ID_PLANO_ENSAIO", "Plano de ensaio");
        pIdPlanoEnsaio.setValue(ctx.getParameter("P_ID_PLANO_ENSAIO"));
        pIdPlanoEnsaio.setSqlExpression("PLANO_ENSAIO_ID");
        if (pIdPlanoEnsaio.isNotNull()) {
            aPlanoEnsaioId.setValue(pIdPlanoEnsaio.getValue());
        }
        pIdCriterioAprovacao = new DomId(ctx, "ID_CRITERIO_APROVACAO", "Critério de aprovação");
        pIdCriterioAprovacao.setValue(ctx.getParameter("P_ID_CRITERIO_APROVACAO"));
        pIdCriterioAprovacao.setSqlExpression("CRITERIO_APROVACAO_ID");
        if (pIdCriterioAprovacao.isNotNull()) {
            aCriterioAprovacaoId.setValue(pIdCriterioAprovacao.getValue());
        }
    }
    
    @Override
    public List<Field> getParameters() {
        if (allParameters == null) {
            allParameters = new ArrayList<Field>();
            allParameters.add(pIdPlanoEnsaio);
            allParameters.add(pIdCriterioAprovacao);
        }
        return allParameters;
    }
    
    @Override
    public void copyBindParameters() {
        EntCriterioAprovacaoPlanoEnsaio record = getRecord();
        if (pIdPlanoEnsaio.isNotNull()) {
            record.setPlanoEnsaioId(pIdPlanoEnsaio.getValue());
        }
        if (pIdCriterioAprovacao.isNotNull()) {
            record.setCriterioAprovacaoId(pIdCriterioAprovacao.getValue());
        }
    }
    
    @Override
    public void retrieveBindParameters() {
        pIdPlanoEnsaio.setValue(getRecord().valueOfPlanoEnsaioId());
        pIdCriterioAprovacao.setValue(getRecord().valueOfCriterioAprovacaoId());
    }
    
    @Override
    public void initEntityBindings() {
        EntityBinding binding;
        
        binding = new EntityBinding("ZTEST.PLANO_EXECUCAO", "PLEX", "Z_PLEX_ID", "ZTEST.CAD_PLANO_EXECUCAO.VIEW");
        binding.addFields(aPlexNome, aPlexSituacao);
        entityBindings.add(binding);
    }
    
    @Override
    public String getQueryPkColumn() {
        return "BASE.ID";
    }
    
    @Override
    public void setId(String value) {
        this.aId.setValue(value);
    }
    
    @Override
    public EntCriterioAprovacaoPlanoEnsaio getRecord() {
        if (base == null) {
            base = new EntCriterioAprovacaoPlanoEnsaio(ctx);
            rec = base;
        }
        return this.base;
    }
    
    @Override
    public String getContextName() {
        return aPlexNome.toText();
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "PLEX_NOME, PLEX_SITUACAO, LKP1_NOME, SEQUENCIA_VALIDACAO";
    }
    
    @Override
    public void translateInsertFks(Form form) {
        ModelQuery query;
        
        // CRITERIO_APROVACAO_ID
        try {
            if (form.hasFields("LKP1_NOME")) {
                query = createQuery()
                        .select("LKP1.ID")
                        .from("CRITERIO_APROVACAO_ENSAIO", "LKP1")
                        .filter("LKP1.NOME", form.get("LKP1_NOME"))
                        ;
                base.setCriterioAprovacaoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
        
        // PLANO_ENSAIO_ID
        try {
            if (form.hasFields("PLEX_NOME", "PLEX_SITUACAO")) {
                query = createQuery()
                        .select("PLEX.ID")
                        .from("PLANO_EXECUCAO", "PLEX")
                        .filter("PLEX.NOME", form.get("PLEX_NOME"))
                        .filter("PLEX.SITUACAO", form.get("PLEX_SITUACAO"))
                        ;
                base.setPlanoEnsaioId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    
    @Override
    public void translateUpdateFks(Form form) {
        ModelQuery query;
        
        // CRITERIO_APROVACAO_ID
        try {
            if (form.hasFields("LKP1_NOME")) {
                query = createQuery()
                        .select("LKP1.ID")
                        .from("CRITERIO_APROVACAO_ENSAIO", "LKP1")
                        .filter("LKP1.NOME", form.get("LKP1_NOME"))
                        ;
                base.setCriterioAprovacaoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
        
        // PLANO_ENSAIO_ID
        try {
            if (form.hasFields("PLEX_NOME", "PLEX_SITUACAO")) {
                query = createQuery()
                        .select("PLEX.ID")
                        .from("PLANO_EXECUCAO", "PLEX")
                        .filter("PLEX.NOME", form.get("PLEX_NOME"))
                        .filter("PLEX.SITUACAO", form.get("PLEX_SITUACAO"))
                        ;
                base.setPlanoEnsaioId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="LIST">
    public class FList extends ListFeature {
        
        @Override
        public void initForm() {
            addField(aPlexNome, "view");
            addField(aPlexSituacao, "view");
            addField(aLkp1Nome, "view");
            addField(aSequenciaValidacao, "view");
            addField(aDataRegistro, "view");
        }
        
        {
            setFeatureName("LIST");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FList());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "LIST";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    public Integer getSequenciaValidacao() {
        return aSequenciaValidacao.getValue();
    }
    
    public void setSequenciaValidacao(Integer value) {
        this.aSequenciaValidacao.setValue(value);
    }
    
    public java.sql.Timestamp getDataRegistro() {
        return aDataRegistro.getValue();
    }
    
    public void setDataRegistro(java.sql.Timestamp value) {
        this.aDataRegistro.setValue(value);
    }
    
    @Override
    public Long getId() {
        return aId.getValue();
    }
    
    public void setId(Long value) {
        this.aId.setValue(value);
    }
    
    public Long getPlanoEnsaioId() {
        return aPlanoEnsaioId.getValue();
    }
    
    public void setPlanoEnsaioId(Long value) {
        this.aPlanoEnsaioId.setValue(value);
    }
    
    public Long getCriterioAprovacaoId() {
        return aCriterioAprovacaoId.getValue();
    }
    
    public void setCriterioAprovacaoId(Long value) {
        this.aCriterioAprovacaoId.setValue(value);
    }
    
    public String getLkp1Nome() {
        return aLkp1Nome.getValue();
    }
    
    public void setLkp1Nome(String value) {
        this.aLkp1Nome.setValue(value);
    }
    
    public String getPlexNome() {
        return aPlexNome.getValue();
    }
    
    public void setPlexNome(String value) {
        this.aPlexNome.setValue(value);
    }
    
    public String getPlexSituacao() {
        return aPlexSituacao.getValue();
    }
    
    public void setPlexSituacao(String value) {
        this.aPlexSituacao.setValue(value);
    }
    
    public Long getParameterIdPlanoEnsaio() {
        return pIdPlanoEnsaio.getValue();
    }
    
    public void setParameterIdPlanoEnsaio(Long value) {
        pIdPlanoEnsaio.setValue(value);
        aPlanoEnsaioId.setValue(value);
    }
    
    public Long getParameterIdCriterioAprovacao() {
        return pIdCriterioAprovacao.getValue();
    }
    
    public void setParameterIdCriterioAprovacao(Long value) {
        pIdCriterioAprovacao.setValue(value);
        aCriterioAprovacaoId.setValue(value);
    }
    // </editor-fold>
    
}
